/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Data;

import Principal.Casilla;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import Principal.Ataque;
import Principal.Efectos;
import Principal.Golpe;
import Principal.Sonidos;
import java.awt.Rectangle;

/**
 *
 * @author rjimenez
 */
public class Jugador {


    private String nombre;
    private int vida;
    private int fuerza;
    private int magia;
    private int fuerzamagica;
    private int costomagico;
    private boolean invencible;
    private boolean visible;
    private int x,y,dx,dy, col, fil;
    private int dir;
    private Image imagen;
    private String nombreimagen ="/img/arriba.gif";
    private int alto;
    private int ancho;
    private int limitex1,limitex2, limitey1, limitey2;
  
    private ArrayList<Ataque> hechizos; 
    private ArrayList<Golpe> ataques;
    private Casilla[][] casillas;
    Sonidos sonido = new Sonidos();
            

    public Jugador() {
    }

    public Jugador(String nombre, int vida, int fuerza, int magia, int fuerzamagica, int costomagico) {
        
        ImageIcon img = new ImageIcon(this.getClass().getResource(nombreimagen));
        this.imagen = img.getImage();
        this.alto = imagen.getWidth(null);
        this.ancho = imagen.getWidth(null);
        this.nombre = nombre;
        this.vida = vida;
        this.fuerza = fuerza;
        this.magia = magia;
        this.fuerzamagica = fuerzamagica;
        this.costomagico = costomagico;
        dir = 1;
        this.limitex1 =0;
        this.limitey1 =100;
        this.hechizos = new ArrayList<Ataque>();
        this.ataques = new ArrayList<Golpe>();
        this.invencible = false;
        this.visible = true;
    }

    public int getCostomagico() {
        return costomagico;
    }

    public void setCostomagico(int costomagico) {
        this.costomagico = costomagico;
    }

    public int getFuerza() {
        return fuerza;
    }

    public void setFuerza(int fuerza) {
        this.fuerza = fuerza;
    }

    public int getFuerzamagica() {
        return fuerzamagica;
    }

    public void setFuerzamagica(int fuerzamagica) {
        this.fuerzamagica = fuerzamagica;
    }

    public int getMagia() {
        return magia;
    }

    public void setMagia(int magia) {
        this.magia = magia;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public int getVida() {
        return vida;
    }

    public void setVida(int vida) {
        this.vida = vida;
    }

    public boolean isInvencible() {
        return invencible;
    }

    public void setInvencible(boolean invencible) {
        this.invencible = invencible;
    }

    public int getLimitex2() {
        return limitex2;
    }

    public void setLimitex2(int limitex2) {
        this.limitex2 = limitex2 - ancho;
    }

    public int getLimitey2() {
        return limitey2;
    }

    public void setLimitey2(int limitey2) {
        this.limitey2 = limitey2 - alto;
    }

    public ArrayList<Ataque> getHechizos() {
        return hechizos;
    }

    public void setHechizos(ArrayList<Ataque> hechizos) {
        this.hechizos = hechizos;
    }

    public boolean isVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }    

    public Image getImagen() {
        return imagen;
    }

    public void setImagen(Image imagen) {
        this.imagen = imagen;
    }
    
    public Casilla[][] getCasillas() {
        return casillas;
    }

    public void setCasillas(Casilla[][] casillas) {
        this.casillas = casillas;
    }

    public int getCol() {
        return col;
    }

    public void setCol(int col) {
        this.col = col;
    }

    public int getFil() {
        return fil;
    }

    public void setFil(int fil) {
        this.fil = fil;
    } 
    
    public void girar()
    {
        System.out.println(dir);
        switch(dir)
            {
                case 1:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/arriba.gif")).getImage();
                    break;

                case 2:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/der.gif")).getImage();
                    break;

                case 3:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/abajo.gif")).getImage();
                    break;

                case 4:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/izq.gif")).getImage();
                    break;

            }

    }    
      
    public void restarVida(int impacto)
    {

        if(!invencible) //no pueden hacer daño
        {
            vida = vida - impacto;
            sonido.efecto(Efectos.HURT);

            if(vida <= 0)
            {
                vida = 0;
            }

        }

    }

    public void recuperarVida(int cura)
    {
        vida = vida + cura;
    }

    public void ejecutarMagia()
    {
        if(costomagico > magia)
        {
            // no puedo ejecutar magia
            System.out.println("se acabo");
        }
        else
        {
            
            magia = magia - costomagico;
            sonido.efecto(Efectos.MAGIC);
            Ataque a;


            switch(dir)
            {
                case 1:
                    a = new Ataque(x + ancho/2, y , limitex2, limitey2, dir,fuerzamagica,1);
                    a.setLimitex1(limitex1);
                    a.setLimitey1(limitey1);
                    hechizos.add(a);
                    break;

                case 2:
                    a = new Ataque(x + ancho, y + alto/2 , limitex2, limitey2, dir,fuerzamagica,1);
                    a.setLimitex1(limitex1);
                    a.setLimitey1(limitey1);
                    hechizos.add(a);
                    
                    break;

                case 3:

                    a = new Ataque(x + ancho/2, y + alto, limitex2, limitey2, dir,fuerzamagica,1);
                    a.setLimitex1(limitex1);
                    a.setLimitey1(limitey1);
                    hechizos.add(a);
                    break;

                case 4:
                    a = new Ataque(x, y+alto/2 , limitex2, limitey2, dir, costomagico,1);
                    a.setLimitex1(limitex1);
                    a.setLimitey1(limitey1);
                    hechizos.add(a);
                    break;

            }
        }
    }

    public void recuperarMagia(int aumento)
    {
        magia = magia + aumento;
    }

    
    
    public void mover()
    {
        int w = casillas.length;
        int h = casillas[casillas.length-1].length;
        
        if(dir == 1 || dir == 3)
        {
            if(fil + dy >= h)
            {
                fil = h - 1;
            }
            else if( fil + dy < 0)
            {
                fil = 0;
            }
            else if(verificarPaso(fil+dy, col))
            {
                 fil = fil +dy;
            }
            else
            {
                fil = fil + 0;
                
            }
        }
        else if(dir == 2 || dir == 4)
        {
            if(col + dx >= w)
            {
                col = w -1;
            }
            else if(col + dx < 0)
            {
                col = 0;
            }
            else if(verificarPaso(fil, col+dx))
            {
                col = col + dx;
            }
            else
            {
                col = col + 0;
            }
        }
        
        x =  casillas[fil][col].getX()+(casillas[fil][col].getAncho()/2 - ancho/2);
        y =  casillas[fil][col].getY()+(casillas[fil][col].getAlto()/2 - alto/2);
        
        
        
    }
    
    public void crearAtaque(int x2, int y2)
    {
        switch(dir)
            {
                case 1:
                    ataques.add(new Golpe(x + ancho/2, y , x2, y2, dir,fuerza));
                    break;

                case 2:
                    ataques.add(new Golpe(x + ancho, y + alto/2 , x2, y2, dir,fuerza));
                    break;

                case 3:
                    ataques.add(new Golpe(x + ancho/2, y + alto, x2, y2, dir,fuerza));
                    break;

                case 4:
                    ataques.add(new Golpe(x, y+alto/2 , x2, y2, dir, fuerza));
                    break;

            }
    }
    
    public void atacar()
    {
        int w = casillas.length;
        int h = casillas[casillas.length-1].length;
        
        switch(dir)
        {
            case 1:
                if(fil - 1 < 0 )
                {
                    
                    //no disparar
                }
                else if(!verificarPaso(fil-1, col))
                {
                    //no disparar
                }
                else
                {
                    
                    int y2 = casillas[fil-1][col].getY() + casillas[fil-1][col].getAlto()/2;                    
                    crearAtaque(x, y2);
                }
                
                break;
            case 2:
                if(col + 1 > w - 1 )
                {
                    
                    
                }
                else if(!verificarPaso(fil, col+1))
                {
                    
                }
                else
                {
                    int x2 = casillas[fil][col+1].getX()+ casillas[fil][col+1].getAncho()/2;                                       
                    crearAtaque(x2, y);
                }
                break;
            case 3:
                if(fil + 1 > h-1 )
                {
                    
                    
                }
                else if(!verificarPaso(fil+1, col))
                {
                    
                }
                else
                {
                    
                    int y2 =  casillas[fil+1][col].getY()+ casillas[fil+1][col].getAlto()/2;                    
                    crearAtaque(x, y2);
                    
                }
                break;
            case 4:
                if(col - 1 <0 )
                {
                    
                    
                }
                else if(!verificarPaso(fil, col- 1))
                {
                    
                }
                else
                {
                    int x2 =  casillas[fil][col-1].getX()+casillas[fil][col-1].getAncho()/2;
                                       
                    crearAtaque(x2, y);
                }
                    
                break;
        
        }
        
    }
    
    public boolean verificarPaso(int f, int c)
    {
        try
        {
           NodoEspacio espacio = casillas[f][c].getEspacio();
           return espacio.isPasable();
        }catch(ArrayIndexOutOfBoundsException ex)
        {
            System.out.println("error en filas: "+f+" error en columas: "+c);
            return false;
        }
    }
    
    public Rectangle getUbicacion()
    {
        return new Rectangle(x, y, alto, ancho);
    }    
    
    
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT) {
            
            dir--;
            

            if(dir<1)
            {
                dir = 4;
            }
            girar();
        }

        if (key == KeyEvent.VK_RIGHT) {

            dir++;
            

            if(dir>4)
            {
                dir =1;
            }
            girar();
        
        }     

        if (key == KeyEvent.VK_UP) {
            
            sonido.efecto(Efectos.WALK);

            switch(dir)
            {
                case 1:
                    dy =-1;
                    break;

                case 2:
                    dx =1;
                    break;

                case 3:
                    dy =1;
                    break;

                case 4:
                    dx = -1;
                    break;

            }

        }
        if (key == KeyEvent.VK_DOWN) {
            
            sonido.efecto(Efectos.WALK);

            switch(dir)
            {
                case 1:
                    dy =1;
                    break;

                case 2:
                    dx =-1;
                    break;

                case 3:
                    dy =-1;
                    break;

                case 4:
                    dx = 1;
                    break;

            }
        
        } if (key == KeyEvent.VK_A) {
            
            sonido.efecto(Efectos.SHOOT);
            
            switch(dir)
            {
                case 1:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/aup.png")).getImage();
                    atacar();
                    break;

                case 2:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/ader.png")).getImage();
                    atacar();
                    break;

                case 3:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/adow.png")).getImage();
                    atacar();
                    break;

                case 4:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/aizq.png")).getImage();
                    atacar();
                    break;

            }

        }
        if (key == KeyEvent.VK_S) {
            
            
            ejecutarMagia();

        }

    }

    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();

        
        if (key == KeyEvent.VK_UP) {

            switch(dir)
            {
                case 1:
                    dy =0;
                    break;

                case 2:
                    dx =0;
                    break;

                case 3:
                    dy =0;
                    break;

                case 4:
                    dx = 0;
                    break;

            }


        }
        if (key == KeyEvent.VK_DOWN) {

            switch(dir)
            {
                case 1:
                    dy =0;
                    break;

                case 2:
                    dx =0;
                    break;

                case 3:
                    dy =0;
                    break;

                case 4:
                    dx = 0;
                    break;

            }


        }
        if( key == KeyEvent.VK_A)
        {
            switch(dir)
            {
                case 1:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/arriba.gif")).getImage();
                    break;

                case 2:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/der.gif")).getImage();
                    break;

                case 3:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/abajo.gif")).getImage();
                    break;

                case 4:
                    this.imagen =new ImageIcon(this.getClass().getResource("/img/izq.gif")).getImage();
                    break;

            }
        }
    }

    public int getAlto() {
        return alto;
    }

    public void setAlto(int alto) {
        this.alto = alto;
    }

    public int getAncho() {
        return ancho;
    }

    public void setAncho(int ancho) {
        this.ancho = ancho;
    }

    public int getDx() {
        return dx;
    }

    public void setDx(int dx) {
        this.dx = dx;
    }

    public int getDy() {
        return dy;
    }

    public void setDy(int dy) {
        this.dy = dy;
    }

    public int getDir() {
        return dir;
    }

    public void setDir(int dir) {
        this.dir = dir;
    }

    public ArrayList<Golpe> getAtaques() {
        return ataques;
    }

    public void setAtaques(ArrayList<Golpe> ataques) {
        this.ataques = ataques;
    }

    public void setLimites(int x1, int y1, int x2, int y2)
    {
        limitex1 = x1;
        limitey1 = y1;
        limitex2 = x2;
        limitey2 = y2;
    }




    
    
    

    }
